Die Übersichtlichkeit der Seite wird durch Javascript erhöht. Ist dies aktiviert, werden die Texte unter den Überschriften durch Anklicken der Überschriften ein- und ausgeblendet.
Dieses Programm begeistert mich, je mehr ich es kennenlerne. Die Dokumentationen dazu, die ich bislang gefunden habe, sind allesamt gut, aber jeweils sehr lückenhaft. Daher habe ich vieles in Unterschiedlichsten Tutorials gelernt. Alles für mich wesentliche möchte ich hier zusammentragen.
Die Tastenfolge Strg+x Strg+c beendet den Emacs. Dabei wird für alle geöffneten Buffer, die geändert wurden gefragt, ob Sie in der dazugehörigen Datei gespeichert werden sollen.
Wenn man eine falsche Tastenkombination gedrückt hat oder aus andern Gründen den gerade aufgerufenen Befehl abbrechen möchte braucht man nur <STRG>+g drücken.
C-h b --> Liste alle Tastaturkomanndos auf
Mit STRG+h b ist es möglich sich die aktuell unter dem Modus geltenden Tastaturkomandos auflisten zu lassen.
C-x C-+ --> Schriftgröße anpassen
Mit ><STRG>+x <STRG>+[+;-]< kann die Schriftgröße im aktuellen Buffer flexibel angepasst werden. Solange keine andere Aktion ausgeführt wird, genügt das wiederholte drücken von Plus oder Minus um die Schrift zu vergrößern bzw. zu verkleinern.
C-x C-q --> Wechsel zwischen read-only und Änderungsmodus
Möchte man ein versehentliches Ändern eines Dokumentes verhindern ist es über diese Tastenkombination möglich die Funktion toggle-read-only aufzurufen. Möchte man dann doch Änderungen durchführen, wiederholt man den Befehl einfach.
Verzeichnismodus gewechselt
Verzeichnis sein
Einfach auf q drücken
ältesten einer Datei
enthalten.
enthalten
Statt einer Datei kann auf diese Weise auch ein leeres Verzeichnis gelöscht werden.
kann auch einfach der neue Name der Datei sein)
Auch sonst ist emacs sehr gut dokummentiert. Diese Dokumentation wird im emacs in sogenannte Info Dokumentationen organisiert. Eine Übersicht kann mann über C-h i aufrufen. Innerhalb dieser Dokumentation kann mann sehr leicht navigieren. Wie das geht steht ebenfalls in einem Info Dokument.
Navigation innerhalb eines Infodokumentes
Ordner anlegen und bekannt machen:
Um eigene Dokumente einzubinden habe ich einen Ordner Pfad:~/.emacs/info angelegt, in den ich alle .info-Dateien hineinkopiere. Dann folgenden Eintrag in der .emacs-Datei hinzufügen, damit emacs den Pfad zu meinen Info-Dateien kennt:
; Einstellung für das Einbinden eigener Infodokumente ; im Verzeichnis ~/.emacs.d/info/ (setq Info-default-directory-list (append '("~/.emacs.d/info/") Info-default-directory-list))
Damit die Infodateien dann im Info-Dir angezeigt werden habe ich im selben Verzeichnis eine Datei namens dir angelegt: Hinweis: statt _* muss * geschrieben werden
persöhnliche Info-DIR Datei im Verzeichnis ~/.emacs.d/info/ ^_ <-- ein Sonderzeichen, das von der orginalen Datei kopiert werden muss File: dir, Node: Top Dies ist der Beginn des INFO-Baums Dieser Verzeichnis-Knoten zeigt ein Menü aller Hauptpunkte an. „q“ beendet Info, „?“ listet alle Info-Befehle auf, „d“ kehrt hierher zurück, „h“ gibt eine Einsteiger-Hilfe, „mEmacs<Return>“ besucht das Emacs-Manual, etc. Im Emacs kann man mit dem zweiten Mausknopf auf einen Menüeintrag oder einen Querverweis klicken, um einen solchen auswählen. _* Menu: Emacs _* Emacs: (emacs). Info zu Emacs (C-h r) _* Info: (info). Einführung in die Nutzung der Info-Dateien _* GNU Texinfo 5.2: (texinfo). Referenz zu texInfo _* LispIntroduction: (~/.emacs.d/info/eintr.info). Einführung in EmacsLisp _* Elisp-Reference: (elisp). Emacs Lisp Referenz
C-x { --> Fenster horizontal schrumpfen
C-x } --> Fenster horizontal vergrößern
Mit der Tastenkombination <STRG>+z ist es möglich den emacs zu pausieren. Dabei wird dieser in einer grafischen Oberfläche minimiert. Im Terminal wird der emacs dann komplett in den Hintergrund verschoben. Durch die Eingabe des Befehls 'fg' oder '%emacs' kann der Emacs dann wieder in den Vordergrund geholt werden. Er ist dann im selben Zustand, indem man ihn zuvor beim drücken von <STRG>+z verlassen hatte.
.emacs zur Laufzeit neu einlesen
M-x eval-buffer in der .emacs Datei lässt diese neu laden.
Blinkenden Cursor im XEmac abschalten
Der Cursor kann nur in der X-Anwendung direkt von emacs beinflusst werden. Dazu einfach folgende Zeile in die .emacs schreiben:
Die Menübar nimmt eigentlich nur Platz auf dem Bildschirm weg. Im Terminal ist das Menü ohnehin nur über <F10>-Taste zu erreichen. Um sie permanent zu entfernen ist folgende Zeile in die Datei .emacs zu schreiben:
Will man unter X die Menu-Bar wieder anschalten nutzt man die Tastenkombination: M-x menu-bar-mode
Über Variabeln können spezielle Verhaltensweisen festgelegt werden.
Text kann im Emacs einfach eingegeben werden. Es gibt hierfür keine besonderen Modis.
C-u N Z --> N Wiederholungen von Z
Nach <STRG>+u kann man eine Zahl eingeben, die angibt wie oft die darauf folgende Eingabe wiederholt wird. So kann man zum Beispiel durch ~<STRG>+u 5 *~ 5 Sterne eingeben.
M-x auto-fill-mode --> Automatischer Zeilenumbruch
Dadurch wird der Auto-Fill-Mode an und ausgeschaltet. Dieser bewirkt, dass nach einer bestimmten Anzahl Zeichen (Standard 70) die Zeile umgebrochen, also die Eingabe automatisch in der folgenden Zeile fortgesetzt wird. Dies ist generell sehr praktisch.
Wenn der auto-fill-Modus nachträglich aktiviert wird oder die Zeichenzahl pro Zeile nachträglich geändert wird, kann man den Text durch die Tastenkombination <ALT>+q entsprechend umformatieren.
C-x f N --> Festlegen der Zeilenlänge N für den auto-fill-mode
Mit ><STRG>+x f Anzahl Zeichen< kann man die Anzahl der Zeichen nach der eine Zeile umgebrochen werden soll festlegen. Dies wird dann bei der eingabe berücksichtigt, sofern der auto-fill-mode angeschaltet ist.
Text zwischen 2 Sternchen wird fett dargestellet.
Text zwischen zwei Slahes wird /kursiv/ dargestellt. Für die Nutzung mit meinem HTML-Parser muss ich die Slashes durch jeweils 2 Backslash ersetzen: kursiv.
Text zwischen zwei Unterstrichen wird unterstrichen
Text zwischen zwei Gleichheitszeichen wird als Code dargestellt
Text zwischen 2 Pluszeichen wurd durchgestrichen dargestellt
Ein bestimmter Bereich kann entweder mit der Maus markiert werden, oder man geht mit den Cursor an den Beginn des Bereiches und drückt dort C-SPC. Dann geht man mit dem Cursor zum Ende des Bereiches. Dabei sieht man, das dieser Bereich ausgewählt wird.
Hat man einen Bereich ausgewählt, kann man Ihn durch die Tastenkombination <STRG>+w ausschneiden.
Hat man einen Bereich ausgewählt, kann mann Ihn durch die Tastenkombination <ALT>+w in die Zwischenablage kopieren.
C-y / M-y --> Einfügen / vorherige einfügen
Der letzte Text, der zuvor durch Ausschneiden oder Einfügen in die Zwischenablage aufgenommen wurde, kann durch die Tastenkombination <STRG>+y an der Stelle des Cursors eingefügt werden. Um Texte einzufügen, die davor in die Zwischenablage aufgenommen worden sind, betätigt man nach der Tastenkombination <STRG>-y die Tastenkombination <ALT>+y. Mit jeden weitern drücken von <ALT>+y wird der aktuell eingefügte Text durch den nächsten Text ersetzt, der in der Zwischenablage enthalten ist. Dies geht solange bis man wieder beim ersten Eintrag angelangt ist.
Mit ~<STRG>+x u~ ist es möglich die letzten Aktionen wieder rückgängig zu machen. Alternativ kann man hierfür auch kurz C-_ verwenden.
Hauptmodies stellen komplette Programme dar, die immer einen bestimmten Zweck dienen. So kann der emacs zum Programmieren in verschiedenen Programmiersprachen, zur Erfassung von Dokumentationen, zum Mail schreiben oder auch zum spielen verwendet werden. Für jede Anwendung gibt es einen entsprechenden Hauptmodus. In der Regel wird der passende Hauptmodus automatisch durch speichern einer Datei mit einer bestimmten Endung eingeschaltet.
Dieses Dokument ist mit dem org-mode erstellt worden. Der org-mod
gestattet es auf einfache Weise ein Dokument zu strukturieren und
Tabellen und Listen zu erstellen. Um diesen nutzen zu können, musste
ich unter Debian zunächst durch: sudo apt get install org-mode
den
org-mode installieren. Danach wird der org-mode durch speichern einer
Datei mit der Endung org gestartet.
Im org-mode wird der Text in Sektionen mit einer Überschrift unterteilt. Die Überschrift einer Sektion beginnt mit einem >*<. Für jede Untersektion wird jeweils ein Stern hinzugefügt. Zur besseren Übersicht bekommt jede Einrücktiefe eine gesonderte Einfärbung. Somit sind die verschiedenen Stufen gut voneinander zu unterscheiden. Die Einrücktiefe kann auch durch <ALT>+Rechts/Links geändert werden. Mit STRG-c RET wird unter dem eintrag ein Eintrag mit gleicher Einrücktiefe erstellt.
Jede Sektion kann auch mit einem Status versehen werden, indem man in der Überschrift bei gedrückter SCHIFT-Taste die Pfeil-Tasten rechts oder links drückt. Das gleiche ereicht man mit der Tastenkombination C-c C-t.
Diese Zustände können wie folgt angepasst werden:
(setq org-todo-keyword-faces '(("TODO" . org-warning) ("DEFERRED" . shadow) ("CANCELED" . (:foreground "blue" :weight bold))))
Allerdings funktioniert dies erst nach einem Neuen einlesen des Puffers.
Nutzt man bei gedrückter SCHIFT-Taste die Pfeil-runter-Taste, so wird zusätzlich eine Priorität [A;B oder C] gesetzt, die allerdings nicht exportiert wird. Anpassbar durch:
#+PRIORITIES: 1 3 2
Listen werden einfach durch ein Minus-Zeichen + Leerzeichen am Anfang erzeugt. Eventuelle Unterpunkte werden dann durch eine Einrückung erreicht. Auch diese Unterpunkte können wieder mit der <Tab>-Taste ein und ausgerollt werden.
Mit Schift + Pfeiltaste kann das Listenzeichen geändert werden!
Listeneinträge können direkt durch die Zeichen '::' Beschreibungen hinzugefügt werden.
Ein Todo-Eintrag kann durch ein Leerzeichen zwischen einer öffnende + schließende eckige Klammer hinter dem Listenzeichen erstellt werden:
Nummerische Zähler werden durch [/] angehängt Prozentuale Zähler werden durch [%] angehängt
Umstrukturierung mit M-Pfeiltaste
<ALT>-Taste gedrückt halten und:
<2015-03-09 Mo>
Es leicht eine Tabelle zu erzeugen, indem man einfach die einzelnen Spalten mit dem <|>-Zeichen einschließt. Trennlinien werden Dann mit einem Minus-Zeichen erstellt.
Spalte 1 | Spalte 2 |
zeile1 | 1.Zeile |
Zeile2 | 2.Zeile |
Ein Link wird in emacs in folgender Syntax eingegben:
URL in eckigen Klammern Kurzname in eckigen Klammern und das ganze von eckigen Klammern umschlossen Beispiel: myPage
Auf die gleiche Weise ist es möglich nach einem bestimten Suchwort innerhalb des Dokumentes zu verzweigen. Also einfach: Suchwort in eckigen Klammer Kurzwort in eckigen Klammern und das ganze von eckigen Klammern umschlossen Beispiel: Suche nach der Überschrift Links Das Aufrufen eines solchen internen Links erfolgt mit C-c C-o während man mit dem Cursor auf dem Linktext ist. Als erstes wird nach dem Suchwort gesucht, das durch das Umschließen mit 2 spitzen Klammern als Ziel definiert ist. Ziel in doppelten spitzen Klammern
Automatisch wird Überschriften gesucht und bei einer Übereinstimmung an diese Stelle verzweigt. Datum und Zeit Ein solcher Link zu einer Überschrift kann durch eine Auswahl angelegt werden. Drückt man nach [[* ESC und dann Tab wird ein Fenster mit möglichen Überschriften angezeigt, die verlinkt werden können. Dies kann dann in dem anderen Fenster einfach ausgewählt werden. Allerdings werden hier auch Listenpunkte angezeigt, zu denen die Verzweigung nicht funktioniert. Liste Datum
Nach einen Sprung über einen internen Link kann mit C-c & wieder an den Absprungpunkt zurückgesprungen werden.
Nach Tags kann gesucht, gefiltert und gelinkt werden. Um ein Tag zu vergeben wird in der Überschrift die Tastenkombination C-c C-c verwendet.
Komentare werden nicht exportiert. Sie werden durch ein >#< am Anfang oder durch das Schlüsselwort COMMENT gekennzeichnet.
Mit ><STRG>+c <STRG>+e< bekommt man eine Auswahl von möglichen Formaten, in die der Text exportiert werden kann. Durch Auswahl des entsprechenden Buchstabens, wird die Datei im selben Verzeichnis in dem ausgewählten Format erstellt. So ist es zum Beispiel leicht möglich den Text als HTML-Seite oder auch als PDF-Dokument zu speichern.
Mit dieser Erweiterung ist es möglich eine Autovervollstädigung zu erreichen, bei der die möglichen Fortsetzungen nicht in einem extra Fenster sondern in einem Auswahlmenü angezeigt werden.
Zur Nutzung muss das Paket auto-complete-el installiert werden.
Dann ist das Paket bei mir noch immer nicht nutzbar. Ich habe gemäß Anleitung die load-path-Variable zu überprüfen. Dies bewerkstelle ich mit:
C-h v load-path RET
Allerdings ist damit alles in Ordnung meine auto-complete-et-Datei ist über das Verzeichnis ~/usr/share/emacs23/site-lisp/auto-complete~ das in der Variable gelistet ist. Mein dict-Verzeichnis befindet sich im Verzeichnis ~/usr/share/auto-complete~.
Ich habe jetzt in der ~/.emacs folgende Zeilen hinzugefügt, mit denen in der Folge die Autovervollständigung von Code in Python automatisch funktioniert:
; Für den Auto-Complete-Mode ; Zuerst installieren über sudo apt-get install auto-complete-el ; dict befindet sich im Verzeichn is /usr/share/auto-complete (require 'auto-complete-config) (ac-config-default)o (add-to-list 'ac-dictionary-directories "/usr/share/auto-complete/dict")
Einfügen kompletter Code-Schnipsel ist mit Yasnippet möglich. So lassen sich auf einfach Weise ständig wiederkehrende Code-Fragmente einfügen. Dabei ist es sogar möglich innerhalb dieser Templates Sprungmarken zu definieren, an die der Cursor nach einander zum ausfüllen springen soll.
Dann gilt es yasnippet zu konfigurieren. Einige Schnipsel sind bereits im Ordner der snippets.el-Datei gespeichert. Dies ist in meinem Fall: ~/usr/share/emacs/site-lisp/yasnippet/snippets/~ Da alle Dateien des Ordners Root gehören, ich allerdings auch die Möglichkeit haben will, mir eigene Schnipsel zu erstellen, gilt es zunächst eine Anpassung zu machen. Hierzu habe ich das Customizing von emacs genutzt:
Dadurch wird unter *(custom-set-variables* in der ~.emacs~-Datei folgender Eintrag hinzugefügt:
'(yas/root-directory (quote ("~/.emacs.d/snippets/" "/usr/share/emacs/site-lisp/yasnippet/snippets/")) nil (yasnippet)))
Nun kann ich eine den jeweiligen Modis entsprechende Ordnerstruktur einrichten unter der ich meine Snippets erstelle und speichere. Will man nun einen neuen Snippet für einen Modus erstellen, für den es noch keinen Ordner gibt, so wird dieser Ordner auf Nachfrage neu erstellt. Dazu zunächst nach Snippets suchen:
M-x yas/find-snippets
Ich habe mir einen Ordner für den snippet-mode erstellt und darin die Datei kopf mit folgenden Inhalt angelegt:
_ # -*- mode: snippet -*- _ # name: mkSnippet _ # key: kopf _ # -- _ # -*- mode: snippet -*- _ # name: $1 _ # key: $2 _ # -- $0
Dadurch ist es leicht möglich neue Snippets zu erstellen. Ich brauche jetzt nur noch
Der Variablenname kann zur Erklärung eingefügt werden und wird später im Formular automatisch beim Eintippen überschrieben. Die Schlußmarke *$0* kann keinen Variablennamen aufnehmen.
Einlesen des neu erstellten Schnipsels
Beispiel: Mein html-Grundgerüst für meine Seiten
_# -*- mode: snippet -*- _# name: myxhtml _# key: myxml _# -- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>${1:Titel} </title> <link type="text/css" rel="stylesheet" href="${2:../style.css}" /> </head> <body> <h1 id="Kopf">${3:Überschrift}<h1> <div id="Navi"> <ul> <li> <a href="${4:Link zur Navigation}">${5:Bezeichnung im Menü}</a></li> </ul> </div> <div id="Inhalt"> $0 </div> </body> </html>
Danach kann ich durch Eingabe von myxml+Tab mein Grundgerüst erhalten.
Unter Code-Browsing verstehe ich die Möglichkeit auf einfache Weise Codestellen anspringen zu können. So möchte ich jeweils zur Stelle der Definition von Funktionen und Variablen springen können, ähnlich wie mir die bei geany gegeben ist. Ich möchte folgende Möglichkeiten zur Verfügung haben:
ECB steht für EmacsCodeBrowsing und erfüllt zum einen meine Ansprüche zum anderen scheint es mir überladen zu sein. Bevor ich dies ausprobiere, will ich noch schauen, ob es vielleicht einfachere Alternativen gibt. Mir genügt hier die Nutzung der Speedbar und die Funktionen die rope zur Verfügung stellt vollständig.
Speedbar ermöglicht eine Übersicht von Dateien, Funktionen und Variablen. Dies erfolgt in einem neuen Fenster. Da dies vor allem in einer Konsole nicht wirklich funktioniert, habe ich die Funktion durch eine sr-speedbar erweitert, die die selbe Funktion in einem parallel angezeigten Buffer-Window bereitstellt.
Speedbar ist bereits vorhanden und funktionstüchtig SrSpeedbar.el habe ich von http://www.emacswiki.org/emacs/download/sr-speedbar.el heruntergeladen und in das Verzeichnis ~/.emacs.de/el/ kopiert.
;;; sr-speedbar.el --- Same frame speedbar ;; Author: Sebastian Rose <sebastian_rose@gmx.de> ;; Maintainer: Sebastian Rose <sebastian_rose@gmx.de> ;; Peter Lunicks <plunix@users.sourceforge.net> ;; Copyright (C) 2008, 2009, Sebastain Rose, all rights reserved. ;; Copyright (C) 2008, 2009, Andy Stewart, all rights reserved. ;; Copyright (C) 2009, Peter Lunicks, all rights reversed. ;; Created: 2008 ;; Version: 0.1.9 ;; Last-Updated: 2013-03-09 20:56:35 ;; URL: http://www.emacswiki.org/emacs/download/sr-speedbar.el ;; Keywords: speedbar, sr-speedbar.el ;; Compatibility: GNU Emacs 22 ~ GNU Emacs 24 ;; ;; Features that might be required by this library: ;; ;; `speedbar' `advice' `cl' ;; ;;; This file is NOT part of GNU Emacs ;;; License ;; ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth ;; Floor, Boston, MA 02110-1301, USA. ;;; Commentary: ;; ;; The sr-speedbar.el was created just because I could not believe what I ;; read on http://www.emacswiki.org/cgi-bin/wiki/Speedbar. They wrote there ;; that it is not possible to show the speedbar in the same frame. But, as ;; we all know, ecb had this already. So I started as some kind of joke :) ;; But when I found it useful and use it all the time. ;; ;; Now you type windows key with 's' (`s-s' in Emacs) will show the speedbar ;; in an extra window, same frame. You can customize the initial width of the ;; speedbar window further down for console/DOS and X/Win/MacOS separately. ;; ;; Below are commands you can use: ;; ;; `sr-speedbar-open' Open `sr-speedbar' window. ;; `sr-speedbar-close' Close `sr-speedbar' window. ;; `sr-speedbar-toggle' Toggle `sr-speedbar' window. ;; `sr-speedbar-select-window' Select `sr-speedbar' window. ;; `sr-speedbar-refresh-turn-on' Turn on refresh speedbar content. ;; `sr-speedbar-refresh-turn-off' Turn off refresh speedbar content. ;; `sr-speedbar-refresh-toggle' Toggle refresh speedbar content. ;; ;; Enjoy! ;) ;; ;;; Installation: ;; ;; Copy sr-speedbar.el to your load-path and add to your ~/.emacs ;; ;; (require 'sr-speedbar) ;; (global-set-key (kbd "s-s") 'sr-speedbar-toggle) ;; ;; ... or any key binding you like. ;; ;;; Customize: ;; ;; `sr-speedbar-width-x' ;; The `sr-speedbar' window width under WINDOW system. ;; `sr-speedbar-width-console' ;; The `sr-speedbar' window width under CONSOLE. ;; `sr-speedbar-max-width' ;; The max window width allowed remember. ;; `sr-speedbar-delete-windows' ;; Whether delete other window before showing up. ;; `sr-speedbar-skip-other-window-p' ;; Whether skip `sr-speedbar' window when use ;; command `other-window' select window in cyclic ordering of windows. ;; `sr-speedbar-auto-refresh' ;; Control status of refresh speedbar content. ;; `sr-speedbar-right-side' ;; Puts the speedbar on the right side if non-nil (else left). ;; ;; All above setup can customize by: ;; M-x customize-group RET sr-speedbar RET ;; ;;; Change log: ;; ;; * 09 March 2013: ;; * Tharre: ;; * Remove Emacs 21 compatibility code as it fails to compile on Emacs 24. ;; ;; * 20 July 2009: ;; * Peter Lunicks: ;; * Add new option `sr-speedbar-right-side' to control which ;; side of the frame the speedbar appears on. ;; ;; * 18 Feb 2009: ;; * Andy Stewart: ;; * Fix bug between ECB and `sr-speedbar-close'. ;; ;; * 29 Jan 2009: ;; * Andy Stewart: ;; * Fix doc. ;; ;; * 13 Jan 2009: ;; * Andy Stewart: ;; * Use `emacs-major-version' instead comment for Emacs 21 compatibility. ;; * Rewrite advice for `pop-to-buffer' to avoid `pop-to-buffer' not effect ;; when have many dedicated window in current frame. ;; * Rewrite advice for `delete-other-windows' to avoid use common variable ;; `delete-protected-window-list' and use `window-dedicated-p' instead. ;; Remove variable `delete-protected-window-list' and function ;; `sr-speedbar-dedicated-match-protected-window-p'. ;; ;; * 04 Jan 2009: ;; * Andy Stewart: ;; * Add new option `sr-speedbar-auto-refresh' control refresh content. ;; * Add new functions: ;; `sr-speedbar-refresh-turn-on', ;; `sr-speedbar-refresh-turn-off', ;; `sr-speedbar-refresh-toggle'. ;; * Fix doc. ;; ;; * 30 Dec 2008: ;; * Andy Stewart: ;; * Rewrite advice for `delete-other-windows' for fix the bug ;; with window configuration save and revert. ;; * Rewrite advice for `delete-window', now just remember window ;; width before deleted, and can use `delete-window' do same effect ;; as command `sr-speedbar-close'. ;; * Add new option `sr-speedbar-max-width'. ;; Remember window width before hide, except larger than value of ;; `sr-speedbar-max-width'. ;; * Add new variable `delete-protected-window-list', for protected ;; special window don't deleted. ;; This variable is common for any extension that use dedicated ;; window. ;; * Fix doc. ;; ;; * 29 Dec 2008: ;; * Andy Stewart: ;; * Pick-up and refactory code that use `buffer-live-p' or `window-live-p', ;; and replace with `sr-speedbar-buffer-exist-p' and ;; `sr-speedbar-window-exist-p'. ;; * Rename some function with prefix `sr-speedbar-' to avoid ;; conflict with other functions. ;; * Pick-up the code that handle advice for `other-window', ;; and replace with function `sr-speedbar-handle-other-window-advice'. ;; * Clean up code, make more clear. ;; ;; * 21 Dec 2008: ;; * Andy Stewart: ;; * Fix the bug `sr-speedbar-open' and `sr-speedbar-close'. ;; * Fix doc. ;; ;; * 20 Dec 2008 ;; * Andy Stewart: ;; * Fix `ad-advised-definition-p' error. ;; * Fix doc. ;; ;; * 17 Dec 2008 ;; * Andy Stewart: ;; * Add new option `sr-speedbar-skip-other-window-p' and new advice ;; for `other-window', make user skip select `sr-speedbar' window ;; when use command `other-window'. ;; * Fix the name of advice, make more clear. ;; * Fix the bug `sr-speedbar-select-window' when no live window exist. ;; * Fix doc. ;; ;; * 16 Dec 2008: ;; * Andy Stewart: ;; * Fix the bug of `sr-speedbar-refresh', use `default-directory' ;; get refresh directory instead through function in `dired'. ;; * Fix `window-live-p' bug, check window valid value before use ;; `window-live-p' test `sr-speedbar-window'. ;; * Fix `buffer-live-p' bug, check buffer valid value before use ;; `buffer-live-p' test `speedbar-buffer'. ;; * Add advice `pop-to-buffer' to make function `display-buffer' ;; can pop-up window when just have two windows (one is `sr-speedbar' ;; window) in current frame. ;; * Add group `sr-speedbar'. ;; More better customize interface through `customize-group'. ;; ;; * 28 Sep 2008: ;; * Andy Stewart: ;; * Fix a bug, when `sr-speedbar-toggle' many times, window width ;; will increment automatically. ;; * Use around advices replace, make code simple. ;; * Use `sr-speedbar-open' replace `sr-speedbar-no-separate-frame'. ;; * Clean up code. ;; ;; * 28 Sep 2008: ;; * Sebastian: ;; * set `sr-speedbar-delete-windows' to nil to avoid ;; the removal of other windows. ;; ;; * 26 Jun 2008: ;; * Sebastain: ;; * Added Andy Stewart's patch to refresh the speedbar's contents. ;; Thanks for this one! ;; ;; * Init: ;; * Sebastian: ;; * Added some lines to get it working: ;; * splitting the window and remember it, ;; * changing the way speedbar finds a file. ;; * File view of speedbar is now working all right. ;; * C-x 1 in other window deletes speedbar-window, just calling ;; M-x sr-speedbar-no-separate-frame again is fine now. ;; * Toggle speedbar works, width is save when toggling. ;; * Recalc speedbar width if window-width - speedbar-width <= 0 ;; * Speedbar window is now dedicated to speedbar-buffer. ;; ;;; Acknowledgements: ;; ;; All emacsers ... :) ;; ;;; Bug ;; ;; ;;; TODO ;; ;; ;; ;;; Require (require 'speedbar) (require 'advice) (require 'cl) ;;; Code: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; User Customization ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defgroup sr-speedbar nil "Same frame speedbar." :group 'speedbar) (defcustom sr-speedbar-width-x 24 "Initial width of `sr-speedbar-window' under window system." :type 'integer :group 'sr-speedbar) (defcustom sr-speedbar-width-console 24 "Initial width of `sr-speedbar-window' on console." :type 'integer :group 'sr-speedbar) (defcustom sr-speedbar-max-width 50 "The max width limit that window allowed. Default, if hide `sr-speedbar' window will remember window width, except the window width larger than this value." :type 'integer :group 'sr-speedbar) (defcustom sr-speedbar-auto-refresh t "Automatically refresh speedbar content when changed directory. Default is t." :type 'boolean :set (lambda (symbol value) (set symbol value)) :group 'sr-speedbar) (defcustom sr-speedbar-right-side t "Show the speedbar to the right side of the current window. If nil, the speedbar will appear on the left. Default is t." :type 'boolean :set (lambda (symbol value) (set symbol value)) :group 'sr-speedbar) (defcustom sr-speedbar-delete-windows nil "Allow the speedbar to delete other windows before showing up. If nil, speedbar will not touch your window configuration. Otherwise `delete-other-windows' will be called before showing the speedbar. Default is nil." :type 'boolean :group 'sr-speedbar) (defcustom sr-speedbar-skip-other-window-p nil "Whether skip `sr-speedbar' window with `other-window'. Default, can use `other-window' select window in cyclic ordering of windows. But sometimes we don't want select `sr-speedbar' window use `other-window'. Just want make `sr-speedbar' window as a view sidebar. So please turn on this option if you want skip `sr-speedbar' window with `other-window'. Default is nil." :type 'boolean :set (lambda (symbol value) (set symbol value) (when (ad-advised-definition-p 'other-window) (sr-speedbar-handle-other-window-advice value))) :group 'sr-speedbar) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Constant ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defconst sr-speedbar-version "0.1.4" "Current version.") (defconst sr-speedbar-buffer-name "*SPEEDBAR*" "The buffer name of sr-speedbar.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar sr-speedbar-width nil "Initial width of speedbar-window.") (defvar sr-speedbar-window nil "Speedbar window.") (defvar sr-speedbar-last-refresh-dictionary nil "The last refresh dictionary record of 'sr-speedbar-refresh'.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Interactive functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;###autoload (defun sr-speedbar-toggle () "Toggle sr-speedbar window. Toggle visibility of sr-speedbar by resizing the `sr-speedbar-window' to a minimal width or the last width when visible. Use this function to create or toggle visibility of a speedbar-window. It will be created if necessary." (interactive) (if (sr-speedbar-exist-p) (sr-speedbar-close) (sr-speedbar-open))) ;;;###autoload (defun sr-speedbar-open () "Create `sr-speedbar' window." (interactive) (if (not (sr-speedbar-exist-p)) (let ((current-window (selected-window))) ;; Ensure only one window is there ;; when `sr-speedbar-delete-windows' is non-nil (if sr-speedbar-delete-windows (delete-other-windows)) ;; Whether activate `other-window' advice ;; to skip `sr-speedbar' window when use `other-window'. (sr-speedbar-handle-other-window-advice sr-speedbar-skip-other-window-p) ;; Switch buffer (if (sr-speedbar-buffer-exist-p speedbar-buffer) (unless (sr-speedbar-window-exist-p sr-speedbar-window) ;if `sr-speedbar' window is not exist (sr-speedbar-get-window)) (if (<= (sr-speedbar-current-window-take-width) sr-speedbar-width) ;if current window width is narrower than `sr-speedbar-width' (sr-speedbar-recalculate-width)) ;recalculate width of `sr-speedbar' (sr-speedbar-get-window) ;get `sr-speedbar' window that split current window (setq speedbar-buffer (get-buffer-create sr-speedbar-buffer-name) speedbar-frame (selected-frame) dframe-attached-frame (selected-frame) speedbar-select-frame-method 'attached speedbar-verbosity-level 0 ;don't say anything, i don't like ... :) speedbar-last-selected-file nil) (set-buffer speedbar-buffer) (buffer-disable-undo speedbar-buffer) ;make disable in speedbar buffer, otherwise will occur `undo-outer-limit' error (speedbar-mode) (speedbar-reconfigure-keymaps) (speedbar-update-contents) (speedbar-set-timer 1) ;; Add speedbar hook. (add-hook 'speedbar-before-visiting-file-hook 'sr-speedbar-before-visiting-file-hook t) (add-hook 'speedbar-before-visiting-tag-hook 'sr-speedbar-before-visiting-tag-hook t) (add-hook 'speedbar-visiting-file-hook 'sr-speedbar-visiting-file-hook t) (add-hook 'speedbar-visiting-tag-hook 'sr-speedbar-visiting-tag-hook t) ;; Add `kill-buffer-hook'. (add-hook 'kill-buffer-hook 'sr-speedbar-kill-buffer-hook) ;add `kill-buffer-hook' ;; Auto refresh speedbar content ;; if option `sr-speedbar-auto-refresh' is non-nil (sr-speedbar-handle-auto-refresh sr-speedbar-auto-refresh)) (set-window-buffer sr-speedbar-window (get-buffer sr-speedbar-buffer-name)) (set-window-dedicated-p sr-speedbar-window t) ;make `sr-speedbar-window' dedicated to speedbar-buffer. (select-window current-window)) (message "`sr-speedbar' window has exist."))) (defun sr-speedbar-close () "Close `sr-speedbar' window and save window width." (interactive) (if (sr-speedbar-exist-p) (let ((current-window (selected-window))) ;; Remember window width. (sr-speedbar-select-window) (sr-speedbar-remember-window-width) ;; Close window. (if (and (require 'ecb nil t) ecb-activated-window-configuration) ;; Toggle ECB window when ECB window activated. (progn (ecb-deactivate) (ecb-activate)) ;; Otherwise delete dedicated window. (delete-window sr-speedbar-window) (if (sr-speedbar-window-exist-p current-window) (select-window current-window)))) (message "`sr-speedbar' window is not exist."))) (defun sr-speedbar-select-window () "Force the windows that contain `sr-speedbar'." (interactive) (if (sr-speedbar-exist-p) (select-window sr-speedbar-window) (message "`sr-speedbar' window is not exist."))) (defun sr-speedbar-refresh-turn-on () "Turn on refresh content automatically." (interactive) (setq sr-speedbar-auto-refresh t) (sr-speedbar-handle-auto-refresh sr-speedbar-auto-refresh t)) (defun sr-speedbar-refresh-turn-off () "Turn off refresh content automatically." (interactive) (setq sr-speedbar-auto-refresh nil) (sr-speedbar-handle-auto-refresh sr-speedbar-auto-refresh t)) (defun sr-speedbar-refresh-toggle () "Toggle refresh content status." (interactive) (setq sr-speedbar-auto-refresh (not sr-speedbar-auto-refresh)) (sr-speedbar-handle-auto-refresh sr-speedbar-auto-refresh t)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; utilise functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun sr-speedbar-exist-p () "Return `non-nil' if `sr-speedbar' is exist. Otherwise return nil." (and (sr-speedbar-buffer-exist-p speedbar-buffer) (sr-speedbar-window-exist-p sr-speedbar-window))) (defun sr-speedbar-window-p () "Return `non-nil' if current window is `sr-speedbar' window. Otherwise return nil." (equal sr-speedbar-buffer-name (buffer-name (window-buffer)))) (defun sr-speedbar-remember-window-width () "Remember window width." (let ((win-width (sr-speedbar-current-window-take-width))) (if (and (sr-speedbar-window-p) (> win-width 1) (<= win-width sr-speedbar-max-width)) (setq sr-speedbar-width win-width)))) (defun sr-speedbar-recalculate-width () "Calculate the speedbar width with respect of window system." (if (and window-system (not (string= "pc" window-system))) (setq sr-speedbar-width sr-speedbar-width-x) (setq sr-speedbar-width sr-speedbar-width-console))) (or sr-speedbar-width (sr-speedbar-recalculate-width)) ;initialization `sr-speedbar-width' (defun sr-speedbar-get-window () "Get `sr-speedbar' window." (let ((current-window (selected-window)) ;; Get split new window. (new-window (split-window (selected-window) (if sr-speedbar-right-side (- (sr-speedbar-current-window-take-width) sr-speedbar-width) sr-speedbar-width) t))) ;; Select split window. (setq sr-speedbar-window (if sr-speedbar-right-side ;; Select right window when `sr-speedbar-right-side' is enable. new-window ;; Otherwise select left widnow. current-window)))) (defun sr-speedbar-before-visiting-file-hook () "Function that hook `speedbar-before-visiting-file-hook'." (select-window (previous-window))) (defun sr-speedbar-before-visiting-tag-hook () "Function that hook `speedbar-before-visiting-tag-hook'." (select-window (previous-window))) (defun sr-speedbar-visiting-file-hook () "Function that hook `speedbar-visiting-file-hook'." (select-window (previous-window))) (defun sr-speedbar-visiting-tag-hook () "Function that hook `speedbar-visiting-tag-hook'." (select-window (previous-window))) (defun sr-speedbar-kill-buffer-hook () "Function that hook `kill-buffer-hook'." (when (eq (current-buffer) speedbar-buffer) (setq speedbar-frame nil dframe-attached-frame nil speedbar-buffer nil) (speedbar-set-timer nil) (remove-hook 'speedbar-before-visiting-file-hook 'sr-speedbar-before-visiting-file-hook) (remove-hook 'speedbar-before-visiting-tag-hook 'sr-speedbar-before-visiting-tag-hook) (remove-hook 'speedbar-visiting-file-hook 'sr-speedbar-visiting-file-hook) (remove-hook 'speedbar-visiting-tag-hook 'sr-speedbar-visiting-tag-hook))) (defun sr-speedbar-refresh () "Refresh the context of speedbar." (when (and (not (equal default-directory sr-speedbar-last-refresh-dictionary)) ;if directory is change (not (sr-speedbar-window-p))) ;and is not in speedbar buffer (setq sr-speedbar-last-refresh-dictionary default-directory) (speedbar-refresh))) (defun sr-speedbar-handle-auto-refresh (activate &optional echo-show) "Automatically refresh speedbar content when changed directory. Do nothing if option ACTIVATE is nil. Will display message if ECHO-SHOW is non-nil." (if activate (progn (add-hook 'speedbar-timer-hook 'sr-speedbar-refresh) (if echo-show (message "Turn on speedbar content refresh automatically."))) (remove-hook 'speedbar-timer-hook 'sr-speedbar-refresh) (if echo-show (message "Turn off speedbar content refresh automatically.")))) (defun sr-speedbar-current-window-take-width (&optional window) "Return the width that WINDOW take up. If WINDOW is nil, get current window." (let ((edges (window-edges window))) (- (nth 2 edges) (nth 0 edges)))) (defun sr-speedbar-window-dedicated-only-one-p () "Only have one non-dedicated window." (interactive) (let ((window-number 0) (dedicated-window-number 0)) (walk-windows (lambda (w) (with-selected-window w (incf window-number) (if (window-dedicated-p w) (incf dedicated-window-number))))) (if (and (> dedicated-window-number 0) (= (- window-number dedicated-window-number) 1)) t nil))) (defun sr-speedbar-window-exist-p (window) "Return `non-nil' if WINDOW is exist. Otherwise return nil." (and window (window-live-p window))) (defun sr-speedbar-buffer-exist-p (buffer) "Return `non-nil' if BUFFER is exist. Otherwise return nil." (and buffer (buffer-live-p buffer))) (defun sr-speedbar-handle-other-window-advice (activate) "Handle advice for function `other-window'. If ACTIVATE is `non-nil' enable advice `sr-speedbar-other-window-advice'. Otherwise disable it." (if activate (ad-enable-advice 'other-window 'after 'sr-speedbar-other-window-advice) (ad-disable-advice 'other-window 'after 'sr-speedbar-other-window-advice)) (ad-activate 'other-window)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Advices ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defadvice delete-other-windows (around sr-speedbar-delete-other-window-advice activate) "This advice to make `sr-speedbar' window can't deleted by command `delete-other-windows'." (let ((sr-speedbar-active-p (sr-speedbar-window-exist-p sr-speedbar-window))) (if sr-speedbar-active-p (let ((current-window (selected-window))) (dolist (win (window-list)) (when (and (window-live-p win) (not (eq current-window win)) (not (window-dedicated-p win))) (delete-window win)))) ad-do-it))) (defadvice delete-window (before sr-speedbar-delete-window-advice activate) "This advice to remember `sr-speedbar' window width before deleted. Use `delete-window' delete `sr-speedbar' window have same effect as `sr-speedbar-close'." ;; Remember window width before deleted. (sr-speedbar-remember-window-width)) (defadvice pop-to-buffer (before sr-speedbar-pop-to-buffer-advice activate) "This advice is to fix `pop-to-buffer' problem with dedicated window. Default, function `display-buffer' can't display buffer in select window if current window is `dedicated'. So function `display-buffer' conflict with `sr-speedbar' window, because `sr-speedbar' window is `dedicated' window. That is to say, when current frame just have one `non-dedicated' window, any functions that use `display-buffer' can't split windows to display buffer, even option `pop-up-windows' is enable. And the example function that can occur above problem is `pop-to-buffer'." (when (and pop-up-windows ;`pop-up-windows' is enable (sr-speedbar-window-dedicated-only-one-p) ;just have one `non-dedicated' window (sr-speedbar-window-exist-p sr-speedbar-window) (not (sr-speedbar-window-p))) ;not in `sr-speedbar' window (split-window-vertically) (windmove-down))) (defadvice other-window (after sr-speedbar-other-window-advice) "Default, can use `other-window' select window in cyclic ordering of windows. But sometimes we don't want select `sr-speedbar' window use `other-window'. Just want make `sr-speedbar' window as a view sidebar. This advice can make `other-window' skip `sr-speedbar' window." (let ((count (or (ad-get-arg 0) 1))) (when (and (sr-speedbar-window-exist-p sr-speedbar-window) (eq sr-speedbar-window (selected-window))) (other-window count)))) (provide 'sr-speedbar) ;;; sr-speedbar.el ends here ;;; LocalWords: sr Sebastain ecb Sep speedbar's Recalc dframe keymaps pc ;;; LocalWords: decicated uncomment
Damit das Modul vom emacs auch gefunden wird, muss ich zunächst die .emacs-Datei wie folgt erweitern:
; Erweitern der load-path für das speichern weiterer Plugins ;/home/maik/.emacs.d/el (add-to-list 'load-path "~/.emacs.d/el/")
Ab dann werden alle in .emacs.d/el/ gespeicherten Module eingelesen.
Damit sr-speedbar auch eingelesen wird, muss außerdem folgendes in der .emacs-Datei ergänzt werden:
; Terminal Speedbar: (require 'sr-speedbar)
M-x customize-group RET sr-speedbar RET
Variable | Zweck |
---|---|
sr-speedbar-width-x | Breite des Fensters unter X |
sr-speedbar-width-console | Breite des Fensters in einer Konsole |
sr-speedbar-max-width | Maximale Fensterbreite |
sr-speedbar-delete-windows | Sollen andere Fenster vor der anzeige gelöscht werden |
sr-speedbar-skip-other-window-p | Beim Fensterwechsel das Speedbarfenster auslassen |
sr-speedbar-auto-refresh | Status der Aktualisierung des Speedbarinhalts |
Befehl | Zweck |
---|---|
sr-speedbar-open | öffnet ein sr-speedbar-Fenster |
sr-speedbar-close | schließt ein sr-speedbar-Fenster |
sr-speedbar-toggle | Wechselt die Anzeige des sr-speedbar-Fensters |
sr-speedbar-select-window | Wechselt ind das sr-speedbar-Fenster |
sr-speedbar-refresh-turn-on | schaltet die Aktualisierung an |
sr-speedbar-refresh-turn-off | schaltet die Aktualisierung aus |
sr-speedbar-refresh-toggle | Wechselt die Aktualisierung | |
Es werden in der Konsole nicht alle Funktionen angezeigt:
Wird ein Funktionsname derzeit zu lang, werden alle darauf folgenden Funktionen in der Konsole nicht mehr angezeigt, im Grafikmodus allerdings schon. Wenn ich die max-width auf 100 Setze tritt das Problem nicht mehr auf. Tatsächlich hat dies nichts mit der Weite zu tun. Statt dessen wird die Liste stark durch Änderungen an den Funktionsnamen beeinflusst. Dies ist allein in der Consolenversion zu beobachten und lässt auf einen Feheler schließen.
Die Speedbar aktualisiert sich nicht von selber
Der angezeigte Buffer der Speedbar passt sich einer Namensänderung einer Funktion nicht automatisch an. Schließe ich den Buffer per C-x k und öffne danach erneut die Speedbar, wird diese korrekt angezeigt. Wie bereits oben beschrieben ist die Änderung der Funktionsnamen mit Problemen bei der Anzeige der Speedbar verbunden.
Es gibt die Möglichkeit die aktuelle Zeile in Emacs hervorzuheben: Dazu kann unter Debian das Paket emacs-goodies-el installiert werden. In diesem Paket sind zahlreiche weitere Erweiterungen. Näheres durch apt-cache show emacs-goodies-el In der .emacs-Datei habe ich folgende Konfiguration
; Aktuelle Zeile hervorheben ; hierfür habe ich das Paket emacs-goodies-el unter Debian installiert (highlight-current-line-on t) (highlight-current-line-whole-line-on t) (highlight-current-line-set-fg-color "white") (highlight-current-line-set-bg-color "purple")
Ein- und Ausblenden von Code-Blöcken
Bislang verwende ich geany zum schreiben von code. Ich möchte mehr und mehr dazu übergehen, Code mit dem emacs zu schreiben. Mit geany ist es möglich Code-Blöcke ein- und auszublenden. Dies ist sehr praktisch, da es Übersicht schafft und einen gleichzeitig ermöglicht, sich auf das Wesentliche zu konzentrieren.
Ein- und Ausblenden mit dem emacs
Das Ein- und Ausblenden beherrscht der Emacs in meiner Installation von Hause aus.
Ohne irgendwelche besonderen Modies zu starten ist es durch direkte Nutzung folgender Tastenkürzel möglich den Inhalt aller Funktionen auszublenden:
Spalte zum Ausblenden)
(defun jao-toggle-selective-display () (interactive) (set-selective-display (if selective-display nil 1))) (global-set-key [f1] 'jao-toggle-selective-display)
das ganze in belibiger Tiefe:
;F1-Taste zum Ausblenden (defun jao-selective-display () "Activate selective display based on the column at point" (interactive) (set-selective-display (if selective-display nil (+ 1 (current-indentation))))) (global-set-key [f1] 'jao-selective-display)
Dazu muss nur der entsprechnde Minior-Mode, der die Funktionalität bereitstellt gestartet werden. Dies erreicht mann mit:
M-x hs-minor-mode
In diesem Mode kann nun die Sichtbarkeit der Code-Blöcke mit folgenden Tastenkürzeln beeinflusst werden:
(hs-toggle-hiding)
(hs-hide-level)
Um das Ein- und Ausblenden von Code-Blöcken auf einfache Weise beim bearbeiten von Python-Code zu ermöglichen genügt es folgende Zeilen in der ~.emacs~-Datei zu ergänzen.
; im python-mode ein einfaches Ein- und Ausblenden von Code-Blöcken ermöglichen (add-hook 'python-mode-hook (lambda() (local-set-key (kbd "C-c <right>") 'hs-show-block) (local-set-key (kbd "C-c <left>") 'hs-hide-block) (local-set-key (kbd "C-c <up>") 'hs-hide-all) (local-set-key (kbd "C-c <down>") 'hs-show-all) (local-set-key (kbd "C-c TAB") 'hs-toggle-hiding) (hs-minor-mode t)))
Somit wird sobald der python-mode gestertet wird automatisch der hs-minor-mode gestartet und durch Strg+C und die Kursor-Tasten kann mit:
Leider lassen sich auf diese Weise nur ganze Funktionen Ein- und Ausblenden. Es wäre aber durchaus interessant auch Blöcke von Verzweigungen und Schleifen oder Kommentarblöcke sowie Datenblöcke Ein und Auszublenden.
Es ist möglich, sich alle Änderungen anzeigen zu lassen, die man am aktuellen Dokument vorgenommen hat. Dazu startet man den highlight-changes-mode.
Speziell für Python habe ich die Einrücktiefe auf 2 Space geändert. Außerdem gibt es mit rope eine Bibliothek für Python, die spezielle Funktionen für diese Programmiersprache bereitstellt, die das Programmieren in Pythen deutlich angenehmer gestalten:
Die Tabweite ist auf 4 Space voreingestellt. In anbetracht der Tatsache, dass ich gern große Schrift verwende, wird dadurch der Platz auf dem Bildschirm recht schnell knapp. Ich bevorzuge daher eine Tabweite von *2 Space*.
Ich habe die Tabweite für den python-mode durch folgenden Eintrag in der .emacs-Datei auf 2 abgeändert:
; Einstellen einer 2 Space Tab-Weite in Python (custom-set-variables '(python-guess-indent nil) '(python-indent 2))
Rope ist eine Bibliothek die sich auf einfache Weise in unterschiedlichste Entwicklungsumgebungen einbinden läst. Diese Bibliothek stellt dann Funktionen wie Autovervollständigung und Dokumentationszugriffe bereit.
sudo apt-get install python-ropemacs
Dann folgenden Eintrag in der .emacs-Datei ergänzen:
; rope (require 'pymacs) (pymacs-load "ropemacs" "rope-") (setq ropemacs-confirm-saving 'nil)
Tastenkombination: C-c g
M-x rope-goto-definition
Springt zu der Stelle im Code an der der Bezeichner unter dem Cursor definiert wird. Dabei wird eine Sprungmarke gesetzt, so dass man mit der Tastenkobination C-u C-SPC wieder an den Ausgangspunkt zurückspringen kann.
Tastenkombination: C-c d
M-x rope-show-doc
Zeigt den Docstring der Function unter dem Cursor an. Der Docstring ist der Kommentar unter dem Funktionsnamen der von jeweils 3 einfachen Anführungszeichen umschlossen wird. Dabei ist zu beachten, dass der Docstring keine deutschen Sonderzeichen enthalten darf. Pflegt man bei seinen Funktionen jeweils vernünftig die Docstrings, ist es möglich über diese Function eine schnelle Übersicht zu erhalten:
Tastenkombination C-c f
M-x rope-find-occurrences
Zeigt alle Stellen an an denen der Bezeichner unter dem Cursor im Code vorkommt. Durch ENTER über dem jeweiligen Suchergebnis, kann mann die Stelle im Code direkt anspringen.
Tastenkombination: C-c r r
M-x rope-rename
Vergibt einen neuen Bezeichner für alle Vorkommen des Bezeichners unter dem Cursor.
Key | Command |
---|---|
M-/ | rope-code-assist |
M-? | rope-lucky-assist |
C-c g | rope-goto-definition |
C-c d | rope-show-doc |
C-c f | rope-find-occurrences |
Key | Command |
---|---|
C-x p o | rope-open-project |
C-x p k | rope-closw-projekt |
C-x p f | rope-find-file |
C-x p 4 f | rope-find-file-other-window |
C-x p u | rope-undo |
C-x p r | rope-redo |
C-x p c | rope-project-config |
C-x p n [mpfd] | rope-create-(module/package/file/directory) |
| rope-write-project | |
C-c r r | rope-rename |
C-c r l | rope-extract-variable |
C-c r m | rope-extract-method |
C-c r i | rope-inline |
C-c r v | rope-move |
C-c r x | rope-restructure |
C-c r u | rope-use-function |
C-c r f | rope-introduce-factory |
C-c r s | rope-change-signature |
C-c r 1 r | rope-rename-current-module |
C-c r 1 v | rope-move-current-module |
C-v r 1 p | rope-module-to-package |
C-c r o | rope-organize-imports |
C-c r n [vfcmp] | rope-generate-(variable/function/class/module/package) |
C-c r a / | rope-code-assist |
C-c r a g | rope-goto-definition |
C-c r a d | rope-shoe-doc |
C-c r a f | rope-finde-occurrences |
C-c r a ? | rope-lucky-assist |
C-c r a j | rope-jump-to-global |
C-c r a c | rope-show-calltip |
| rope-analyze-module | |
| rope-auto-import | |
| rope-generate-autoimport-cache |
:PROPERTIES: :ORDERED: t :END:
Nebenmodies werden durch die eingabe M-x Mode-Name an und ausgeschaltet. Sie erfüllen in allen Hauptmodies den selben Zweck reagieren aber jeweils so, wie es in dem entsprechendem Hauptmodus sinnvoll ist.
Mit dem auto-fill-mode wird gewährleistet, das der Text nach einer bestimmten Anzahl von Zeichen umgebrochen also in der folgenden Zeile fortgesetzt wird. Die Anzahl der Zeilen kann mit >C-x f Anzahl< festgelegt werden. Wird er nachträglich eingeschaltet, kann durch M-q der Text entsprechend automatisch umformatiert werden.
Schaltet die Menübar an und aus. Auch wenn die Menü-Bar nicht zu sehen ist, kann weiterhin mit >F10< auf das Menü zugegriffen werden.
Zeigt die Zeit in der Statusleiste an
Heute (<2014-03-18 Di>) habe ich etwas über den ido-mode gelesen. Dieser modus erlaubt es quasi on-the-fly meine Eingaben beim suchen von Dateien oder verschiedenen geöffneten Buffern zu verarbeiten. Dabei sucht er jeweils alle passenden Einträge, die meine Eingabe im Namen enthalten, also auch die, die nicht mit diesen Buchstaben beginnen. Das ermöglicht ein sehr schnelles und vor allem einfaches Navigieren.
Der ido-mode läst sich wie folgt leicht bei Bedarf starten:
M+x ido-mode
Da der Modus nicht stört, sondern stehts hilfreich ist, möchte ich diesen aber lieber dauerhaft aktiviert haben. Dazu ist der .emacs-Datei folgendes hinzuzufügen:
;ido-mode zum einfachen Navigieren zu Dateien und Buffern (require 'ido) (ido-mode t)
Wie gewohnt gelten die Tastenkombinationen: C-x C-f :: zum öffnen einer Datei C-x C-b :: zum wechseln in einen anderen Buffer
Mit C-x C-f wird in gewohnter Weise die Dateiauswahl gestartet. Hier braucht man nun einfach nur ein paar Zeichen zu tippen und ido sucht direkt die passenden Einträge und listet diese auf. Mit den Pfeiltasten oder C-s für next und C-r für previous kann mann durch diese Ergebnisliste blättern und ein passendes Ergebnis mit ENTER übernehmen. Möchte man die Ergebnisliste weiter eingrenzen, so drückt man C-SPC und kann nun innerhalb der vorher gefundenen Ergebnisliste durch tippen des nächsten Suchbegriffs weiter filtern. Mit der Backspace-Taste kann mann zum übergeordneten Vewrzeichnis wechseln. *~/* wechselt zum Home- und *//* in das root-Verzeichnis. Um das Verhalten ohne ido temporär wieder zu erhalten drückt man C-f zum Datei finden oder C-d um in den Directory-Modus zu wechseln. Eine neue Datei kann mit C-j erstellt werden. Wechselt man in ein Verzeichnis mit ENTER, wird dieses in eine Historie aufgenommen. Durch diese Historie kann man mit M-p rückwärz oder mit M-n vorwärz blättern. M-s sucht die nachfolgende Eingabe innerhalb der Historie. Möchte man ein Verzeichnis nicht mehr in der Historie haben, kann man das aktuelle Verzeichnis mit M-k aus der Historie löschen.
Emacs ist im Grunde ein einfacher Texteditor. Was Ihn besonders macht ist, dass er eine Lisp-Laufzeitumgebung intigriert hat. Diese ermöglicht es den Editor beliebig zu erweitern und damit seine Funktionalität anzupassen. Dies wurde seit Beginn seiner Existenz auch zahlreich getan, so dass es verschiedenste Programme gibt, die innerhalb dieses Editors laufen und es ermöglichen, den Emacs für alles mögliche zu verwenden. Mir wird es in diesem Punkt zunächst darum gehen, mich mit der dahinter stehenden Programmiersprache zu beschäftigen, damit ich die Programme verstehen und ggf. später an meine Bedürfnisse anpassen kann.
Dazu werde ich folgende Anleitung Schritt für Schritt abarbeiten: Lisp-Tutorial (en)